import os
import yaml
import logging
from logging.config import dictConfig
from pathlib import Path


def setup_logging():
    """
    初始化日志系统，优先尝试加载 config/logging.yaml。
    如果失败，则使用基础日志配置作为回退。
    """
    base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
    config_path = os.path.join(base_dir, 'config', 'logging.yaml')
    
    try:
        if os.path.exists(config_path):
            with open(config_path) as f:
                config = yaml.safe_load(f)
                if config is None:
                    raise ValueError("logging.yaml 文件为空或格式错误")
                dictConfig(config)
        else:
            # 文件不存在时使用基础日志配置
            logging.basicConfig(
                level=logging.INFO,
                format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
            )
            logging.warning(f"⚠️ 未找到日志配置文件: {config_path}，使用默认日志配置")
    except Exception as e:
        # 出现任何配置错误时也使用基础配置
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        )
        logging.error(f"❌ 加载日志配置失败: {str(e)}，使用默认日志配置")


def load_config(config_file: str = "settings.yaml") -> dict:
    """
    加载指定的YAML配置文件，返回配置字典。
    
    :param config_file: 配置文件名，默认为 settings.yaml
    :return: 包含配置内容的字典
    """
    base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
    config_path = Path(base_dir) / "config" / config_file

    if not config_path.exists():
        raise FileNotFoundError(f"❌ 未找到配置文件: {config_path}")

    try:
        with open(config_path, "r", encoding="utf-8") as f:
            return yaml.safe_load(f)
    except Exception as e:
        raise RuntimeError(f"❌ 读取配置文件失败: {str(e)}")
    
def get_logger(name: str):
    """
    从 logging.yaml 配置文件中加载日志配置并返回一个 logger 实例
    :param name: logger 名称（通常为 __name__）
    :return: 配置好的 logger 对象
    """
    config_path = Path(__file__).parent.parent.parent / "config" / "logging.yaml"

    if config_path.exists():
        # 如果存在 logging.yaml，使用它来配置日志系统
        import logging.config

        with open(config_path, 'r', encoding='utf-8') as f:
            config = yaml.safe_load(f.read())
            logging.config.dictConfig(config)
    else:
        # 否则使用默认的日志配置
        logging.basicConfig(
            level=logging.INFO,
            format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        )

    return logging.getLogger(name)